from typing import Any
from axiom_boot.di import autowired, service, conditional_on_setting
from axiom_boot.logging.setup import get_logger
from axiom_boot.task.arq_manager import ArqManager

logger = get_logger(__name__)

@conditional_on_setting(key="task__enabled")
@service()
class TaskManager:
    """
    提供一个统一的接口来提交后台任务。
    """
    
    def __init__(self, arq_manager: ArqManager = autowired()):
        self.arq_manager = arq_manager

    async def submit_task(self, task_name: str, *args: Any, **kwargs: Any) -> str | None:
        """
        异步提交一个任务到任务队列。

        Args:
            task_name: 在 ARQ Worker 中注册的任务函数名。
            *args: 任务函数的参数。
            **kwargs: 任务函数的关键字参数。

        Returns:
            任务的 Job ID，如果提交成功。
        """
        try:
            logger.debug(f"TaskManager: 准备通过 ArqManager 提交任务 '{task_name}'。")
            job = await self.arq_manager.enqueue_task(task_name, *args, **kwargs)
            if job:
                logger.info(f"任务已成功入队: {task_name}, Job ID: {job.job_id}")
                return job.job_id
            else:
                logger.warning(f"任务入队未能返回 Job 实例: {task_name}")
                return None
        except Exception as e:
            logger.error(f"任务提交失败: {task_name}, 错误: {e}")
            raise